//layui模块的定义
;layui.define(['myApi', 'myStorage', "jquery", "layer","nprogress"], function(exports) {
	/*layui模块申明*/
	var myApi = layui.myApi,myStorage = layui.myStorage,jquery = layui.jquery,layer = layui.layer;
	
	NProgress.configure({ ease: 'ease', speed: 500, trickleRate: 0.1, trickleSpeed: 200, showSpinner: false });
	
	/**允许跨域*/
	jquery.support.cors = true;
	
	/**扩充字符串对象方法：开头*/
	if (typeof String.prototype.startsWith != 'function') {
		String.prototype.startsWith = function (prefix){
	    return this.slice(0, prefix.length) === prefix;
	  };
	}
	
	/**扩充字符串对象方法：结尾*/
	if (typeof String.prototype.endsWith != 'function') {
		String.prototype.endsWith = function(suffix) {
			return this.indexOf(suffix, this.length - suffix.length) !== -1;
		};
	}
	
	/**
	 * jquery扩展
	 */
	(function($) {
		/**
		 * 源生字段：已有默认值
		 * async 默认值: true。默认设置下，所有请求均为异步请求。如果需要发送同步请求，请将此选项设置为 false。
		 *       注意，同步请求将锁住浏览器，用户其它操作必须等待请求完成才可以执行。
		 * cache 是否缓存
		 * contentType 请求媒体格式
		 * context 函数上下文this
		 * dataType 响应格式
		 * data 发送到服务器的数据，对象存储
		 * processData 请求数据是否进行UrlEncode处理
		 * timeout 超时时间
		 * type 请求方式("POST" 或 "GET")， 默认为 "POST"
		 * 
		 * 源生字段：必传选项
		 * url 发送请求的地址
		 * 
		 * 源生字段：选填字段
		 * dataType 预期服务器返回的数据类型，常用的如：xml、html、json、text，默认为json
		 * success 成功回调函数
		 * error 失败回调函数
		 * beforeSend 请求前处理函数
		 * complete 完成后处理函数（无论成功或失败）
		 * 
		 * 扩展字段
		 * contentJson 传输json字符串
		 * show 是否显示进度图标
		 * tip 成功/失败信息弹框
		 * successText 成功提示文本
		 */
		jquery.myAjax = function(options) {
			var defaluts = {
				contentJson:true,
				async : true,
				cache : true,
				show : true,
				contentType : "application/json;charset=UTF-8",
				context : 'document.body', //ajax上下文设置为body,方便加上蒙层
				dataType: "json",
				processData : false, //不进行对象转查询参数串处理，直接使用jsonString响应
				timeout : 15000, //5秒
				type : "post",
				tip : true,
				successText : '执行成功！'
			};

			var opts = $.extend(defaluts, options);
			var tempData = opts.data ? opts.data : {};
			if(!tempData.typeProject || tempData.typeProject == '') {
				tempData.typeProject = myApi.THIS_TYPE_PROJECT;
			}
			var data = opts.contentJson ? JSON.stringify(tempData) : tempData;
			var currentAjax = $.ajax({
				url: opts.url,
				async: opts.async,
				cache: opts.cache,
				contentType: opts.contentType,
				context: opts.context,
				dataType: opts.dataType,
				timeout: opts.timeout,
				type: opts.type,
				data: data,
				success: function(result) {
					if(opts.show) {
						layer.closeAll();
					}
					//登录超时
					if(result.overdue) {
						myStorage.remove(myApi.CURRENT_USER);
						myStorage.remove(myApi.CURRENT_TOKEN);
						top.location.href = myApi.webs.login;
						return;
					}
					//请求成功
					//业务处理成功
					if(result.resultCode == myApi.SUCCESS) {
						if(opts.tip) {
							layer.msg(opts.successText, { icon: 5, time : 1500 });
						}
						opts.success(result);
						return;
					}
					//业务处理失败
					if(opts.businessFail){
						opts.businessFail(result);
					}
					//错误提示
					if(opts.tip) {
						//请求异常
						var tipMsg = result.resultMsg;
						if(!tipMsg ||tipMsg.trim() == '') {
							tipMsg = '请求发生异常';
						}
						layer.msg(result.resultMsg, { icon: 6, time : 2000 });
					}
				},
				error: function(XMLHttpRequest, textStatus, errorThrown) {
					if(opts.show) {
						layer.closeAll();
					}
					if(console) {
						console.info("error:" + XMLHttpRequest.responseText);
					}
					if(opts.error) {
						opts.error(XMLHttpRequest, textStatus, errorThrown);
					}
				},
				/*发送请求之前调用*/
				beforeSend: function(XMLHttpRequest) {
					if(opts.show) {
//						NProgress.start();
						layer.load(0, {time: 5000});
					}
					if(opts.beforeSend) {
						opts.beforeSend(XMLHttpRequest);
						return;
					}
					var token = myStorage.get(myApi.CURRENT_TOKEN);
					if(token && token != '') {
						XMLHttpRequest.setRequestHeader(myApi.HEADER_FOR_TOKEN, myStorage.get(myApi.CURRENT_TOKEN));
					}
					var device = layui.device();
					XMLHttpRequest.setRequestHeader(myApi.HEADER_MOBILE_FLAG, device.ios ? 'ios' : (device.android ? 'android' : 'pc'));
				},
				/*请求完成之后调用，无论成功或失败*/
				complete: function(XMLHttpRequest, textStatus) {
//					if(opts.show) {
//						NProgress.done(true);
//						layer.closeAll();
//					}
					if(opts.complete) {
						opts.complete(XMLHttpRequest, textStatus);
					}
				}
			});
			return currentAjax;
		};
		/**
		 * 获取请求参数
		 * @param {Object} name 参数名称
		 */
		jquery.getUrlData = function(name) {
			var url = location.href;
			var reg = new RegExp("(^|\\?|&)" + name + "=([^&]*)(\\s|&|$)", "i");
			if(reg.test(url)) return decodeURIComponent(RegExp.$2.replace(/\+/g, " "));
			return "";
		}

	})(jquery);
	
	exports('myInit', {});
});